﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace QldtSdh.GUI
{
    using BLL;
    using DAL;
    using DAL.Models;
    using QldtSdh.Utils;
    using QldtSdh.GUI.Utils;

    public partial class UcLichBanGiangVien : QldtSdh.GUI.Common.BaseUserControl, QldtSdh.GUI.Common.IHocKyChangable
    {
        private bool _DoNotLoadGiangVienList = false;
        private bool _DoNotLoadChiTietGiangVien = false;
        private bool _DoNotUpdateGuiBySelectedGiangVien = false;

        public UcLichBanGiangVien()
        {
            InitializeComponent();

            gridGiangVien.SetDataGridViewAsReadonly(rowHeadersVisible: true, columnHeadersVisible: false);
            gridGiangVien.AddRowIndexing();
            gridBan.SetDataGridViewAsReadonly(rowHeadersVisible: false, columnHeadersVisible: true);
            gridBan.AddRowIndexing();
        }

        public void ChangeHocKy(DAL.Models.HocKy hocKy)
        {
            this.SetHocKy(hocKy);

            this._DoNotLoadGiangVienList = true;
            try
            {
                using (var db = CEMS4UG_DHKHContext.GetContext())
                {
                    // Nạp danh sách các đơn vị phụ trách chuyên môn
                    var lstDonVi = BizDaoTao.GetListDonViDaoTaoTrongHocKy(hocKy, db);

                    bsDonViPhuTrach.DataSource = lstDonVi;
                    cbxDonViPhuTrach.DisplayMember = "TenDonVi";
                    cbxDonViPhuTrach.DataSource = bsDonViPhuTrach;
                }
            }
            finally
            {
                this._DoNotLoadGiangVienList = false;
            }

            UpdateGuiBySelectedDonViPhuTrach();
        }

        internal void SetHocKy(DAL.Models.HocKy hocKy)
        {
            this.HocKy = hocKy;

            // Nạp thông tin bận của giảng viên trong học kỳ
            this._DoNotLoadGiangVienList = true;
            try
            {
                using (var db = CEMS4UG_DHKHContext.GetContext())
                {
                    // Nạp danh sách các đơn vị phụ trách chuyên môn
                    var lstDonVi = BizDaoTao.GetListDonViDaoTaoTrongHocKy(hocKy, db);

                    bsDonViPhuTrach.DataSource = lstDonVi;
                    cbxDonViPhuTrach.DisplayMember = "TenDonVi";
                    cbxDonViPhuTrach.DataSource = bsDonViPhuTrach;
                }
            }
            finally
            {
                this._DoNotLoadGiangVienList = false;
            }

            UpdateGuiBySelectedDonViPhuTrach();
        }

        public DAL.Models.HocKy HocKy { get; private set; }

        /// <summary>
        /// Đơn vị đang được chọn trên giao diện
        /// </summary>
        private DonVi SelectedDonVi
        {
            get
            {
                DonVi donVi = null;
                if (bsDonViPhuTrach.Current != null)
                    donVi = bsDonViPhuTrach.Current as DonVi;
                return donVi;
            }
        }

        private GiangVien SelectedGiangVien
        {
            get
            {
                if (bsGiangVien.Current != null)
                    return bsGiangVien.Current as GiangVien;
                return null;
            }
        }

        private CongViecBanGiangVien SelectedCongViecBanGiangVien
        {
            get { if (bsBan.Current != null) return bsBan.Current as CongViecBanGiangVien; else return null; }
        }

        private void UpdateGuiBySelectedDonViPhuTrach()
        {
            if (_DoNotLoadGiangVienList)
                return;
            NapDanhSachGiangVien();
        }

        /// <summary>
        /// Nạp danh sách giảng viên thuộc đơn vị phụ trách "SelectedDonViPhuTrach", có tham gia giảng dạy trong học kỳ "HocKy".
        /// </summary>
        public void NapDanhSachGiangVien()
        {
            this._DoNotLoadChiTietGiangVien = true;
            try
            {
                var hocKy = this.HocKy;
                var donVi = this.SelectedDonVi;
                if (donVi == null)
                    bsGiangVien.DataSource = null;
                else
                    bsGiangVien.DataSource = BizGiangVien.GetListGiangVien(cuaDonVi: donVi, thamGiaDaoTaoTrongHocKy: hocKy);
                gridGiangVien.SetDataSource(bsGiangVien);
            }
            finally
            {
                this._DoNotLoadChiTietGiangVien = false;
            }

            HienThiThongTinThongKe();
            UpdateGuiBySelectedGiangVien();
        }

        private void HienThiThongTinThongKe()
        {
            if (bsGiangVien.Count == 0)
                lblThongKeSoGiangVien.Text = "Không có giảng viên nào";
            else
                lblThongKeSoGiangVien.Text = string.Format("Có {0} giảng viên", bsGiangVien.Count);
        }

        private void UpdateGuiBySelectedGiangVien()
        {
            _DoNotUpdateGuiBySelectedGiangVien = true;
            var selectedDonVi = this.SelectedDonVi;
            var giangVien = this.SelectedGiangVien;
            if (HocKy == null || giangVien == null || selectedDonVi == null)
            {
                lblSelectedGiangVien_Details.Text = "";
                bsBan.DataSource = null;
            }
            else
            {
                lblSelectedGiangVien_Details.Text = string.Format("Thông tin bận của {0} trong {1}",
                    giangVien.GiangVienDescTKB, HocKy.TenHocKyDayDu);
                bsBan.DataSource = BizCongViecBanCuaGiangVien.GetListMucNoiDungBan(cuaGiangVien: giangVien, trongHocKy: HocKy);
                gridBan.SetDataSource(bsBan);
            }
            _DoNotUpdateGuiBySelectedGiangVien = false;

            HienThiThongTinThongKeBan();
            UpdateGuiBySelectedCongViecBanGiangVien();
        }

        private void HienThiThongTinThongKeBan()
        {
            if (bsBan.Count == 0)
                lblThongKeThoiKhoaBieu.Text = "Không có mục nội dung bận nào";
            else
                lblThongKeThoiKhoaBieu.Text = string.Format("Có {0} mục nội dung bận", bsBan.Count);
        }

        private void bsGiangVien_CurrentChanged(object sender, EventArgs e)
        {
            if (_DoNotLoadChiTietGiangVien)
                return;
            UpdateGuiBySelectedGiangVien();
        }

        private void bsDonViPhuTrach_CurrentChanged(object sender, EventArgs e)
        {
            if (_DoNotLoadGiangVienList)
                return;
            UpdateGuiBySelectedDonViPhuTrach();
        }

        private void bsBan_CurrentChanged(object sender, EventArgs e)
        {
            UpdateGuiBySelectedCongViecBanGiangVien();
        }

        private void UpdateGuiBySelectedCongViecBanGiangVien()
        {
            var item = this.SelectedCongViecBanGiangVien;
            btnSua.Enabled = btnXoa.Enabled = item != null;
        }

        private void btnThem_Click(object sender, EventArgs e)
        {
            var giangVien = this.SelectedGiangVien;
            if (giangVien == null)
            {
                DialogUtils.ShowErrorWithDefaultTitle("Bạn phải chọn giảng viên để bổ sung công việc bận");
                return;
            }
            var hocKy = this.HocKy;
            if (hocKy == null)
            {
                DialogUtils.ShowErrorWithDefaultTitle("Bạn phải xác định học kỳ để bổ sung công việc bận");
                return;
            }

            var frm = new DaoTao.FormCongViecBanGiangVien_ChiTiet(giangVien, hocKy);
            frm.ShowDialog();
            if (frm.EffectedRecords > 0)
                UpdateGuiBySelectedGiangVien();
        }

        private void btnSua_Click(object sender, EventArgs e)
        {
            var x = this.SelectedCongViecBanGiangVien;
            if (x == null)
            {
                DialogUtils.ShowErrorWithDefaultTitle("Bạn phải chọn một đối tượng công việc bận để chỉnh sửa");
                return;
            }
            var giangVien = this.SelectedGiangVien;
            var hocKy = this.HocKy;
            var frm = new DaoTao.FormCongViecBanGiangVien_ChiTiet(giangVien, hocKy, x);
            frm.ShowDialog();
            if (frm.EffectedRecords > 0)
                UpdateGuiBySelectedGiangVien();
        }

        private void btnXoa_Click(object sender, EventArgs e)
        {
            var x = this.SelectedCongViecBanGiangVien;
            if (x == null)
            {
                DialogUtils.ShowErrorWithDefaultTitle("Bạn phải chọn một đối tượng công việc bận để chỉnh sửa");
                return;
            }
            if (DialogUtils.Confirmed("Bạn có chắc chắn xoá công việc \"{0}\" của giảng viên không?", x.NoiDungBan) == false)
                return;
            try
            {
                BizCongViecBanCuaGiangVien.Delete(x.CongViecBanGiangVienGUID);
                UpdateGuiBySelectedGiangVien();
            }
            catch (Exception exc)
            {
                DialogUtils.ShowErrorWithDefaultTitle("Không thể xoá công việc bận được.\nChi tiết lỗi: " + exc.Message);
            }
        }
    }
}
